Los gráficos univariables son representaciones visuales de datos que nos ayudan a comprender y analizar una sola variable. En otras palabras, muestran información sobre una única característica o aspecto de un conjunto de datos.
Imagínate que tienes una lista de personas y quieres estudiar la altura de cada una. Si graficas estas alturas en un gráfico univariable, tendrías en el eje vertical (el que va hacia arriba y hacia abajo) la altura, y en el eje horizontal (el que va de izquierda a derecha) tendrías los nombres de las personas o simplemente un número que las identifique.
Al representar estos datos en un gráfico univariable, puedes observar patrones, tendencias o distribuciones de altura. Por ejemplo, podrías notar que la mayoría de las personas tienen una altura similar y que solo unas pocas son significativamente más altas o más bajas.
Existen diferentes tipos de gráficos univariables, como histogramas, gráficos de barras, pie o gráficos de línea, entre otros. Cada tipo de gráfico se utiliza para visualizar diferentes tipos de datos y analizar diferentes características.
En esta práctica realizaremos las visualizaciones con diferentes librerías del lenguaje de programación Python como lo son Pandas, Matplotlib, Seaborn y Plotly, cada tipo de gráfico de ejemplificara con dichas librerias.

Los gráficos de barras, también llamados gráficos de columnas o barplot, nos sirven para mostrar magnitudes de variables numéricas a lo largo de diferentes grupos o categorías en el eje horizontal X, y en el eje vertical Y tendremos los valores numéricos, Luego se alza una barra de cada punto del eje X hasta el valor numérico eje Y que le corresponde a esa categoría en esa variable.
Este tipo de gráfico se usa principalmente para comparar variables numéricas de diferentes grupos en los datos y cuando se quiere enfatizar cambios de magnitudes que hay entre estas variables a lo largo de diferentes grupos, los gráficos de barras múltiples y gráficos de barra apiladas son las variantes de este.
No se debería utilizar estos gráficos en los siguientes casos:
A continuación utilizaremos el data set de Titanic para visualizar algunos ejemplos del gráfico de barra, este se realizará con tres diferentes librerías pandas, seaborn y matplotlib.
import pandas as pd # cargamos librerias
import seaborn as sns
import matplotlib.pyplot as plt
import plotly.express as px
import numpy as np
# cambio de dimensiones de canvas de manera global
plt.rcParams['figure.figsize'] = (6,4)
df = pd.read_csv('./datasets/titanic.csv') # en este caso utilizaremos el data set titanic
df.head(5)
| PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
| 1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
| 2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
| 3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | S |
| 4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S |
¿Cuantos pasajeros hombres y cuantas pasajeras mujeres habian en el Titanic.?
pasajeros_sexo = df.groupby('Sex').agg({
'PassengerId':'count'
})
print(pasajeros_sexo)
PassengerId Sex female 314 male 577
# Graficamos con Pandas
plt.style.use('seaborn-darkgrid')
ax = pasajeros_sexo.plot.bar(
y='PassengerId',
title='Cantidad de pasajeros por Sexo',
width= 0.3,
#figsize=(10,5)
)
ax.set_ylabel('Numero de Pasajeros')
Text(0, 0.5, 'Numero de Pasajeros')
pasajeros_sexo2 = pasajeros_sexo.reset_index() # pasamos sex a columna
# graficamos con la libreria seaborn
sns.barplot(
data=pasajeros_sexo2,
x='Sex',
y='PassengerId',
).set(title='Cantidad de Pasajeros por Sexo')
#plt.style.use('ggplot')
[Text(0.5, 1.0, 'Cantidad de Pasajeros por Sexo')]
# graficamos con la libreria matplotlib
ax=plt.bar(
pasajeros_sexo2['Sex'],
pasajeros_sexo2['PassengerId'],
)
plt.title("Cantidad de Pasajeros por Sexo")
plt.ylabel('PassengerId')
plt.xlabel('Sex')
#plt.style.use('ggplot')
Text(0.5, 0, 'Sex')
Un gráfico de pie es una representación visual simple y circular que muestra la proporción de diferentes categorías o partes de un todo. Se compone de secciones de diferentes tamaños, donde cada sección representa un porcentaje o fracción de la cantidad total. Este tipo de gráfico se utiliza para comunicar de manera rápida y clara la distribución relativa de las partes dentro de un conjunto de datos.
Características de un diagrama circular:
En este caso a realizar la visualización del gráfico de pie con la librería pandas y plotly.
# Graficamos con pandas
pasajeros_sexo.plot.pie(
y='PassengerId',
startangle=90,
autopct='%1.1f%%'
).set(title='Pasajeros por Sexo')
plt.style.use('ggplot')
# Graficamos con plotly
fig = px.pie(
pasajeros_sexo2, # lo hacemos con sex como columna mas no como indice
names='Sex',
values='PassengerId',
width=600,
height=400,
template='plotly'
)
fig.update_layout(title_text='Proporción de Pasajeros por Clase', title_x=0.5)
fig.show()
# EJEMPLO # 2
pasajeros_pclass = df.groupby('Pclass').agg({
'PassengerId':'count'
})
print(pasajeros_pclass)
PassengerId Pclass 1 216 2 184 3 491
# Graficamos con plotly
pasajeros_pclass2 = pasajeros_pclass.reset_index() # pasamos sex a columna
print(pasajeros_pclass2)
Pclass PassengerId 0 1 216 1 2 184 2 3 491
fig = px.pie(
pasajeros_pclass2, # lo hacemos con sex como columna mas no como indice
names='Pclass',
values='PassengerId',
hole=0.5,
width=600,
height=400
)
fig.update_layout(title_text='Proporción de Pasajeros por Clase', title_x=0.5)
fig.show()
También conocido como diagrama de caja y bigotes, principalmente nos sirve para visualizar estadísticos de nuestras variables numéricas, es decir, es una representación visual que muestra de manera resumida la distribución de un conjunto de datos numéricos. Consiste en un rectángulo que se divide en cuatro partes principales: la mediana, el primer cuartil, el tercer cuartil y los bigotes. La mediana se representa como una línea en el centro del rectángulo, mientras que el primer y tercer cuartil se marcan como límites inferiores y superiores del rectángulo. Los bigotes se extienden desde los cuartiles hasta los valores mínimo y máximo observados, excluyendo los valores atípicos. Los gráficos de cajas son útiles para visualizar la dispersión, la simetría y la presencia de valores atípicos en un conjunto de datos.
Se utiliza cuando se quiere comparar diversos grupos por medio de sus estadísticos como lo son la mediana y cuartiles.
También es muy utilizado para visualizar si hay datos outliers dentro de nuestras variables o categorías.
No se debe utilizar para conocer la distribución de los datos.
Esta visualizacion la realizaremos con la librerias pandas, seaborn y plotly.
¿ Informacion de la edad de los hombres y mujeres del titanic.? (target)
df_age = df.dropna(subset = ['Age'], axis = 'index') # eliminamos valores nulos de la columna Age
# Graficamos con pandas
ax=df_age.boxplot(
column = 'Age',
by = 'Sex'
)
ax.set_ylabel('Age')
#plt.style.use('classic')
Text(0, 0.5, 'Age')
# Graficamos con seaborn
sns.boxplot(
data=df_age,
x='Sex',
y='Age'
).set(title='Edad de Pasajeros')
sns.set_theme(
'talk'
)
#sns.set_style('darkgrid')
# Graficamos con plotly
fig = px.box(
df_age,
x='Sex',
y='Age',
width=700,
height=500,
)
fig.update_layout(title_text='Edad de Pasajeros Por Sexo', title_x=0.5)
fig.show()
Un gráfico de violines nos permite ver como están distribuidos los datos, manteniendo todas las bondades del diagrama de cajas, podríamos decir que es una representación visual el cual muestra la distribución y densidad de una variable cuantitativa en diferentes categorías o grupos. Combina un diagrama de caja y bigotes con curvas de densidad a cada lado.
# Graficamos con seaborn nota: este diagrama lo podemos no lo podemos graficar con pandas
sns.violinplot(
data = df_age,
x = 'Sex',
y = 'Age'
).set(title='Numero de Pasajeros por Sexo')
[Text(0.5, 1.0, 'Numero de Pasajeros por Sexo')]
# Graficamos cpn plotly
fig = px.violin(
df_age,
x='Sex',
y='Age',
width=800,
height=500,
)
fig.update_layout(title_text='Edad de Pasajeros Por Sexo', title_x=0.5)
fig.show()
Muestra la distribución de una variable numérica como un conjunto de barras. Los datos numéricos se agrupan en "bins" (clases o grupos) según un rango de valores. Cada "bin" va a tener una barra. La altura de la barra representa cuantos puntos de datos existen dentro del rango del "bin". Usualmente, es el primer gráfico a realizar de todas las columnas numéricas de mi dataset, ya que me dice como se distribuyen mis datos.
Un histograma es una representación gráfica simple y visual de la distribución de datos en un conjunto. Consiste en una serie de barras adyacentes que muestran la frecuencia o la cantidad de veces que ocurre cada valor en el conjunto de datos. En el eje vertical se representa la frecuencia, mientras que en el eje horizontal se muestran los valores o rangos de valores del conjunto.
El histograma sirve para proporcionar una visión general de la distribución de los datos y para identificar patrones, tendencias y anomalías. Permite visualizar si los datos se agrupan en torno a ciertos valores, si siguen una distribución normal o si presentan valores atípicos. También puede ayudar a tomar decisiones informadas al analizar datos y comparar diferentes conjuntos de datos.
¿Distribución de edad de hombres y de mujeres?
# Graficamos con pandas
df.hist(
'Age',
by='Sex',
bins=10,
)
array([<AxesSubplot:title={'center':'female'}>,
<AxesSubplot:title={'center':'male'}>], dtype=object)
# Graficamos con seaborn
sns.histplot(
data = df_age,
x='Age'
).set(title='Cantidad dePasajeros por Edad')
[Text(0.5, 1.0, 'Cantidad dePasajeros por Edad')]
# Graficamos con plotly
fig = px.histogram(
df_age,
x='Age',
text_auto = True,
width=800,
height=500,
)
fig.update_layout(title_text='Cantidad dePasajeros por Edad', title_x=0.5)
fig.show()
Es una representación gráfica suave y continua de la distribución de una variable continua, que se construye utilizando funciones de kernel centradas en cada punto de datos para estimar la densidad en todo el rango de la variable,Los picos en la curva indican regiones con alta densidad de datos, mientras que los valles representan regiones con baja densidad este se utiliza debido a que en el histograma a veces es complicado visualizar la forma de mi distribución y como se sitribuyen los datos.
# Graficamos son seaborn
sns.histplot(
data = df_age,
x='Age',
kde=True,
stat='probability',
hue='Sex'
).set(title='Cantidad dePasajeros por Edad')
[Text(0.5, 1.0, 'Cantidad dePasajeros por Edad')]
La utilidad de los gráficos de línea radica en su capacidad para mostrar tendencias y patrones a lo largo del tiempo o de una secuencia. Estos gráficos permiten identificar cambios y variaciones en los datos, así como la dirección y la magnitud de dichos cambios. Al conectar los puntos con líneas, se facilita la visualización de la trayectoria general de los datos, lo que ayuda a entender la evolución de una variable a lo largo del eje temporal o la secuencia establecida.
Además de mostrar tendencias, los gráficos de línea también permiten comparar varias series de datos en el mismo gráfico. Al representar múltiples líneas en un solo gráfico(Gráficos Multilineas), es posible visualizar la relación y la interacción entre diferentes variables, lo que ayuda a identificar correlaciones y patrones más complejos.
Tiene un objetivo similar al gráfico de barras. Nos sirve para mostrar diferencias de variables numéricas a través de mi variable en el Eje X. Sin embargo, es más útil cuando queremos mostrar tendencias de subida o de bajada de mi variable numérica. A diferencia del grafico de barras, el Eje X de izquierda a derecha suele representar una unidad de progresión ordenada de menor a mayor (ejemplo: días, años, meses, horas; es decir, usualmente unidades de tiempo). Es decir, Variables categóricas ordinales. A diferencia del gráfico de barras, yo puedo tener muchas categorías o puntos en el Eje X ya que no necesito dibujar barras en cada punto. El gráfico puede tener varias líneas que representan diferentes grupos. En este caso se denomina gráfico multilinea. Y obviamente, cada línea tiene que estar correctamente diferenciada.
Para este tipo de grafico lo ejemplificaremos con un dataset de ventas de varios supermercados de una misma cadena.
https://raw.githubusercontent.com/lkuffo/data-viz/main/data/tienda_ventas.csv
¿Analizar como ha cambiado la ventas de los productos por mes y año?
df_ventas = pd.read_csv('./datasets/tienda_ventas.csv', index_col='id') # en este caso utilizaremos el data set de evntas tienda
df_ventas.head(3)
| date | store_nbr | family | sales | onpromotion | |
|---|---|---|---|---|---|
| id | |||||
| 0 | 2013-01-01 | 1 | AUTOMOTIVE | 0.0 | 0 |
| 1 | 2013-01-01 | 1 | BABY CARE | 0.0 | 0 |
| 2 | 2013-01-01 | 1 | BEAUTY | 0.0 | 0 |
Calculamos todas la ventas de las diferentes tiendas en un mes
df_ventas['mes'] = df_ventas['date'].apply(lambda x: x[:7])
ventas_mes = df_ventas.groupby('mes').agg({
'sales':'sum'
})
ventas_mes.head(3)
| sales | |
|---|---|
| mes | |
| 2013-01 | 1.032762e+07 |
| 2013-02 | 9.658960e+06 |
| 2013-03 | 1.142850e+07 |
# Graficamos con pandas
ax=ventas_mes.plot.line(
y='sales',
style='.-',
figsize=(12,4),
title='Ventas por Mes'
)
ax.set_xlabel(
'Periodo'
)
ax.set_ylabel(
'Ventas',
)
Text(0, 0.5, 'Ventas')
# Graficamos con plotly
fig = px.line(
ventas_mes,
x=ventas_mes.index.values,
y='sales',
width=700,
height=500,
labels={
'x':'Periodo',
'sales':'Ventas en Millones $'
}
)
fig.update_layout(
title_text='Ventas por Mes',
title_x=0.5)
fig.show()
¿Comparar para el año 2015 las ventas de 3 familias de productos diferentes(Meats,Seafood y Dairy)?
df_ventas['year'] = df_ventas['date'].apply(lambda x: x[:4])
df_2015 = df_ventas[
(df_ventas['year'] == '2015') &
(df_ventas['family'].isin(['SEAFOOD','MEATS','DAIRY']))
]
df_2015.head(3)
| date | store_nbr | family | sales | onpromotion | mes | year | |
|---|---|---|---|---|---|---|---|
| id | |||||||
| 1297304 | 2015-01-01 | 1 | DAIRY | 0.0 | 0 | 2015-01 | 2015 |
| 1297320 | 2015-01-01 | 1 | MEATS | 0.0 | 0 | 2015-01 | 2015 |
| 1297328 | 2015-01-01 | 1 | SEAFOOD | 0.0 | 0 | 2015-01 | 2015 |
agrupacion = df_2015.groupby(['mes','family']).agg({
'sales':'sum'
})
pivot = agrupacion.reset_index(1).pivot(columns='family').droplevel(0,axis='columns')
# Graficamos con pandas
ax = pivot.plot.line(
subplots=True,
title='Ventas de 3 tipos de Producto en el año 2015',
figsize=(10,4),
)
# Graficamos con plotly
fig = px.line(
pivot,
width=700,
height=400,
labels={
'mes':'Periodo',
'value':'Ventas en Millones $',
'family':'Tipo de Producto'
}
)
fig.update_layout(
title_text='Ventas de 3 tipos de Producto en el año 2015',
title_x=0.5)
fig.show()
Es una representación visual que muestra cómo se distribuyen y cambian las diferentes categorías de datos a lo largo del tiempo o de una variable independiente, utilizando áreas apiladas para ilustrar la contribución relativa de cada categoría,tiene un objetivo similar al gráfico de barras. Nos sirve para mostrar diferencias de variables numéricas a través de mi variable en el Eje X. Sin embargo, es más útil cuando queremos mostrar tendencias de subida o de bajada de mi variable numérica. A diferencia del grafico de barras, el Eje X de izquierda a derecha suele representar una unidad de progresión ordenada de menor a mayor (ejemplo: días, años, meses, horas; es decir, usualmente unidades de tiempo). Es decir, Variables categóricas ordinales. A diferencia del gráfico de barras, yo puedo tener muchas categorías o puntos en el Eje X ya que no necesito dibujar barras en cada punto. El gráfico puede tener varias líneas que representan diferentes grupos.
Este tipo de gráfico es comúnmente utilizado en diversas áreas, como la visualización de datos financieros, la representación de cambios en la composición demográfica, la comparación de ventas por categoría de productos, entre otros. Ayuda a identificar rápidamente las tendencias y patrones en la distribución de los datos y a comparar la importancia relativa de las diferentes categorías en un contexto determinado.
# Graficamos con pandas
ax=ventas_mes.plot.area(
y='sales',
figsize=(12,4),
title='Ventas por Mes'
)
ax.set_xlabel(
'Periodo'
)
ax.set_ylabel(
'Vetas'
)
Text(0, 0.5, 'Vetas')
# grafico de areas apiladas
ax=pivot.plot.area(
stacked=True,
title='Ventas por Mes',
figsize=(10,4),
)
ax.set_xlabel(
'Periodo'
)
ax.set_ylabel(
'Sales'
)
Text(0, 0.5, 'Sales')
# grafico de areas agrupadas
ax=pivot.plot.area(
stacked=False,
title='Ventas por Mes',
figsize=(10,4),
)
ax.set_xlabel(
'Periodo'
)
ax.set_ylabel(
'Sales'
)
Text(0, 0.5, 'Sales')